﻿using System;
using System.Diagnostics.CodeAnalysis;
using System.Windows.Controls;
using Pfz.DataTypes;
using Pfz.Factoring;

namespace Pfz.WpfControls.ValueControls
{
	/// <summary>
	/// Control that edit enums.
	/// </summary>
	[SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses")]
	[AutoRegisterInControlFactory(typeof(Enum), true)]
	internal sealed class EnumControl<T>:
		UserControl,
		IValueControl
	{
		private ComboBox _comboBox = new ComboBox();
		
		/// <summary>
		/// Creates a new EnumControl instance.
		/// </summary>
		public EnumControl()
		{
			Content = _comboBox;

			var items = _comboBox.Items;
			var values = Enum.GetValues(typeof(T));
			foreach(Enum enumValue in values)
			{
				var wrapper = new EnumWrapper(enumValue);
				items.Add(wrapper);
			}
		}
		
		#region IValueContainer<Enum> Members
			/// <summary>
			/// Gets or sets the enum value.
			/// </summary>
			public T Value
			{
				get
				{
					var selectedItem = _comboBox.SelectedItem;
					if (selectedItem == null)
						return default(T);
						
					EnumWrapper wrapper = (EnumWrapper)selectedItem;
					object value = wrapper.Value;
					return (T)value;
				}
				set
				{
					object obj = value;
					_comboBox.SelectedItem = new EnumWrapper((Enum)obj);
				}
			}
		#endregion
		#region IValueContainer Members
			object IValueContainer.Value
			{
				get
				{
					return Value;
				}
				set
				{
					Value = (T)value;
				}
			}
		#endregion

		#region IValueControl Members
			/// <summary>
			/// Clears the selection.
			/// </summary>
			public void Clear()
			{
				_comboBox.SelectedIndex = -1;
			}

			bool IValueControl.IsReadOnly
			{
				get
				{
					return !IsEnabled;
				}
				set
				{
					IsEnabled = !value;
				}
			}
		#endregion
	}
}
